﻿#ifndef WRWORKTCPCOMMSERVERSOCKET_H
#define WRWORKTCPCOMMSERVERSOCKET_H

#include "WRWorkTcpCommServer.h"
#include "../../WRSoft-Utility/Runtime/WRDataPacket.h"

#include <QMutex>
#include <QQueue>
#include <QTcpSocket>

//声明工作TCP通讯服务器对象。
class WRWorkTcpCommServerSession;

//表示工作TCP通讯服务器套接字。
class WRWorkTcpCommServerSocket : public QTcpSocket
{
    Q_OBJECT

private:
    //是否可用。
    WR32s m_available;

    //读取缓存长度。
    WR32s m_rBufLen;
    //读取数据长度。
    WR32s m_rDatLen;
    //读取缓存数组。
    char* m_rBufArr;

    //发送同步。
    QMutex m_wMutex;
    //发送数据列队。
    QQueue<WRDataPacket*> m_wQueue;
    //写入数据长度。
    WR32s m_wDatLen;
    //写入数据对象。
    WRDataPacket* m_wDatPkg;
    //写入数据状态。
    bool m_wStatus;

    //服务会话。
    WRWorkTcpCommServerSession* m_session;

    //执行关闭操作。
    void doClose(void);

    //执行数据写稿操作。
    void doWritting(void);

    //处理接收到的数据，返回余下的数据长度。
    WR32s process(const char* buf, WR32s len);

private slots:
    //当出现错误后调用此方法。
    void onError(QAbstractSocket::SocketError socketError);
    //当断开连接后调用此方法。
    void onDisconnected(void);
    //当数据写入后调用此方法。
    void onWritten(qint64 bytes);
    //当数据到来后调用此方法。
    void onReadyRead(void);

public:
    //初始化TCP服务会话。
    explicit WRWorkTcpCommServerSocket(WRWorkTcpCommServer* parent);
    //释放当前对象所占用的相关资源。
    ~WRWorkTcpCommServerSocket();

    //执行写入操作。
    bool process(WRDataPacket* packet);

    //验证当前会话是否可用。
    inline bool validate(void)
    {
        if (m_available <= 0)
        {
            return false;
        }
        m_available = 0;
        return true;
    }

    //执行消息处理。
    bool event(QEvent * e);
};

#endif // WRWORKTCPCOMMSERVERSOCKET_H
